package com.ktgj.customer.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.Days;

/**  
 * @Description: 时间处理共通类 
 * Revision History:
 * <who>       <when>        <what>
 * aiSme 2013-3-18 create 
 */ 
public class DateUtils {
	/**
	 * 天猫时间单位：天
	 */
	public static final String TMALL_PERIOD_UNIT_DAY="D";
	/**
	 * 天猫时间单位：周
	 */
	public static final String TMALL_PERIOD_UNIT_WEEK="W";
	/**
	 * 天猫时间单位：月
	 */
	public static final String TMALL_PERIOD_UNIT_MONTH="M";
	/**
	 * 天猫时间单位：年
	 */
	public static final String TMALL_PERIOD_UNIT_YEAR="Y";

	

	/**  
	 * @Fields: 默认日期模式 yyyy-MM-dd 
	 */ 
	public static final String PATTERN_DATE = "yyyy-MM-dd";
	
	/**  
	 * @Fields: 默认时间模式 yyyy-MM-dd HH:mm:ss 
	 */ 
	public static final String PATTERN_TIME = "yyyy-MM-dd HH:mm:ss";
	
	/**  
	 * @Fields: 默认日期模式 yyyy-MM-dd 
	 */ 
	public static final String PATTERN_DATE_NO_MIDLINE = "yyyyMMdd";

	/**  
	 * @Fields: 时间模式 yyyy-MM-dd HH:mm 
	 */ 
	public static final String YYYY_MM_DD_HH_MI = "yyyy-MM-dd HH:mm";
	
	/**  
	 * @Fields: 日期（时间）分隔符
	 */ 
	public static final String DATE_MIDLINE = "- :,/";

	/**  
	 * @Fields: 日期格式化器 
	 */ 
	public static final DateFormat formatter = new SimpleDateFormat(
			PATTERN_TIME);
	
	/**
	 * 分钟（单位:毫秒）
	 */
	public static final long minute=60*1000l;
	/**
	 * 小时（单位:毫秒）
	 */
	public static final long hour=minute*60;
	/**
	 * 天（单位:毫秒）
	 */
	public static final long day=24*3600*1000l;

	/**  
	 * @Description: 格式化日期 
	 * @param date
	 * @param pattern
	 * @return String 
	 */
	public static String formatDate(Date date, String pattern) {
		if (null == date)
			throw new RuntimeException("日期为空错误!");
		if (StringUtils.isNotBlank(pattern))
			return new SimpleDateFormat(pattern).format(date);
		return formatter.format(date);
	}
	
	/**  
	 * @Description: 格式化日期 时间
	 * @param date
	 * @param pattern
	 * @return String 
	 */
	public static String formatTime(Date date, String pattern) {
		if (null == date)
			throw new RuntimeException("日期为空错误!");
		if (StringUtils.isNotBlank(pattern))
			return new SimpleDateFormat(pattern).format(date);
		return formatter.format(date);
	}

	/**  
	 * @Description: 解析日期 
	 * @param date
	 * @param pattern
	 * @return Date 
	 */
	public static Date parseDate(String date, String pattern) {
		if (null == date)
			throw new RuntimeException("日期为空错误!");
		try {
			if (StringUtils.isNotBlank(pattern))
				return new SimpleDateFormat(pattern).parse(date);
			return formatter.parse(date);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**  
	 * @Description: 格式化日期 
	 * @param date
	 * @return String 
	 */
	public static String formatDate(Date date) {
		return formatDate(date, null);
	}

	/**  
	 * @Description: 解析日期 
	 * @param date
	 * @return Date 
	 */
	public static Date parseDate(String date) {
		return parseDate(date, null);
	}

	/**  
	 * @Description: 得到当前日期及时间 格式为yyyy-MM-dd HH:mm:ss 
	 * @return String 
	 */
	public static String getNowDateTime() {
		return formatDate(new Date(), PATTERN_TIME);
	}

	/**  
	 * @Description: 得到当前日期 格式为yyyy-MM-dd 
	 * @return String 
	 */
	public static String getNowDate() {
		return formatDate(new Date(), PATTERN_DATE);
	}
	
	public static String getNowTime(){
		return formatTime(new Date(),"HH:mm:ss");
	}
	
	public static String getNowDateTimeByPattern(String pattern){
		return formatTime(new Date(),pattern);
	}
	
	/**  
	 * @Description: 得到当前日期 格式为yyyy-MM
	 * @return String 
	 */
	public static String getNowMonth() {
		return formatDate(new Date(), "yyyy-MM");
	}
	
	/**  
	 * @Description: 得到当前日期 格式为yyyyMMdd 
	 * @return String 
	 */
	public static String getNowDateNoMidline() {
		return formatDate(new Date(), PATTERN_DATE_NO_MIDLINE);
	}

	/**  
	 * @Description: 两个时间相减，返回毫秒数 
	 * @param minuendDate
	 * @param subtrahendDate
	 * @return long 
	 */
	public static long subtraction(Date minuendDate, Date subtrahendDate) {
		return minuendDate.getTime() - subtrahendDate.getTime();
	}

	/**  
	 * @Description: 时间加法 
	 * @param date
	 * @param time
	 * @return Date 
	 */
	public static Date add(Date date, long time) {
		return new Date(date.getTime() + time);
	}

	/**  
	 * @Description: 日期转换yyyymmdd->yyyy-mm-dd 
	 * @param date
	 * @return String 
	 */
	public static String changeDate(String date) {
		String changedate = "";
		if (date != null && date.length() >= 8 && date.indexOf("-") < 0) {
			changedate = date.substring(0, 4) + "-" + date.substring(4, 6)
					+ "-" + date.substring(6, 8);
		} else {
			changedate = date;
		}
		return changedate;
	}

	/**  
	 * @Description: 时间转换yyyymmddhhmmss->hh:mm:ss 
	 * @param date
	 * @return String 
	 */
	public static String changeTime(String date) {
		String changedate = "";
		if (date != null && date.length() == 14) {
			changedate = date.substring(8, 10) + ":" + date.substring(10, 12)
					+ ":" + date.substring(12, 14);
		} else if (date != null && date.length() == 6) {
			changedate = date.substring(0, 2) + ":" + date.substring(2, 4)
					+ ":" + date.substring(4, 6);
		} else if (date != null && date.length() == 4) {
			changedate = date.substring(0, 2) + ":" + date.substring(2, 4);
		} else {
			changedate = date;
		}
		return changedate;
	}
	

	
	/**
	 * 得到当前日期减去指定的天数
	 * @Description: 得到当前日期减去指定的天数
	 * @param days 
	 * @return Date 
	 */
	public static Date getDateToMinusDays(int days){
		DateTime fooDate =  DateTime.now();
		fooDate=fooDate.minusDays(days);
		return fooDate.toDate();
	}
	
	/**
	 * 得到某个日期减去指定的天数
	 * @Description: 得到某个日期减去指定的天数
	 * @param date
	 * @param days 
	 * @return Date 
	 */
	public static Date getDateToMinusDays(Date date,int days){
		DateTime fooDate =  new DateTime(date);
		fooDate=fooDate.minusDays(days);
		return fooDate.toDate();
	}
	/**
	 * 得到某个日期减去指定的周
	 * @Description: 得到某个日期减去指定的周
	 * @param date
	 * @param weeks 
	 * @return Date 
	 */
	public static Date getDateToMinusWeeks(Date date,int weeks){
		DateTime fooDate =  new DateTime(date);
		fooDate=fooDate.minusWeeks(weeks);
		return fooDate.toDate();
	}
	
	/**
	 * 得到当前日期减去指定的月份
	 * @Description: 得到当前日期减去指定的月份
	 * @param months 
	 * @return Date 
	 */
	public static Date getDateToMinusMonths(int months){
		DateTime fooDate =  DateTime.now();
		fooDate=fooDate.minusMonths(months);
		return fooDate.toDate();
	}
	/**
	 * 日期减去指定的月份
	 * @Description: 日期减去指定的月份
	 * @param months 
	 * @return Date 
	 */
	public static Date getDateToMinusMonths(Date date,int months){
		DateTime fooDate =  new DateTime(date);
		fooDate=fooDate.minusMonths(months);
		return fooDate.toDate();
	}
	
	/**
	 * 得到某个日期减去指定的年
	 * @Description: 得到某个日期减去指定的年
	 * @param date
	 * @param weeks 
	 * @return Date 
	 */
	public static Date getDateToMinusYears(Date date,int years){
		DateTime fooDate =  new DateTime(date);
		fooDate=fooDate.minusYears(years);
		return fooDate.toDate();
	}
	
	/*public static Date getDateToMinusMillis(Date date,int millis){
		DateTime fooDate =  new DateTime(date);
		fooDate=fooDate.minusMillis(millis);
		return fooDate.toDate();
	}*/
	
	/**
	 * 得到某个日期减去指定毫秒
	 * @Description: 得到某个日期减去指定毫秒
	 * @param date
	 * @param msec 
	 * @return Date 
	 */
	public static Date getDateToMinus(Date date,long msec){
		DateTime fooDate =  new DateTime(date);
		fooDate=fooDate.minus(msec);
		return fooDate.toDate();
	}
	
	

	
	
	/**
	 * 得到某个日期加上指定的天数
	 * @Description: 得到某个日期加上指定的天数
	 * @param date
	 * @param days 
	 * @return Date 
	 */
	public static Date getDateToPlusDays(Date date,int days){
		DateTime fooDate =  new DateTime(date);
		fooDate=fooDate.plusDays(days);
		return fooDate.toDate();
	}
	/**
	 * 得到某个日期加上指定的周
	 * @Description: 得到某个日期加上指定的周
	 * @param date
	 * @param weeks 
	 * @return Date 
	 */
	public static Date getDateToPlusWeeks(Date date,int weeks){
		DateTime fooDate =  new DateTime(date);
		fooDate=fooDate.plusWeeks(weeks);
		return fooDate.toDate();
	}
	
	
	/**
	 * 日期加上指定的月份
	 * @Description: 日期加上指定的月份
	 * @param months 
	 * @return Date 
	 */
	public static Date getDateToPlusMonths(Date date,int months){
		DateTime fooDate =  new DateTime(date);
		fooDate=fooDate.plusMonths(months);
		return fooDate.toDate();
	}
	
	/**
	 * 得到某个日期加上指定的年
	 * @Description: 得到某个日期加上指定的年
	 * @param date
	 * @param weeks 
	 * @return Date 
	 */
	public static Date getDateToPlusYears(Date date,int years){
		DateTime fooDate =  new DateTime(date);
		fooDate=fooDate.plusYears(years);
		return fooDate.toDate();
	}
	
	public static Date getDateToPlus(Date date,long msec){
		DateTime fooDate =  new DateTime(date);
		fooDate=fooDate.plus(msec);
		return fooDate.toDate();
	}
	
	/**
	 * date1是否晚于date2
	 * @Description: date1是否晚于date2 
	 * @param date1
	 * @param date2
	 * @return boolean 
	 */
	public static boolean isAfter(Date date1,Date date2){
		DateTime time1=new DateTime(date1);
		DateTime time2=new DateTime(date2);
		return time1.isAfter(time2);
	}
	
	/**
	 * date1是否早于date2
	 * @Description: date1是否早于date2 
	 * @param date1
	 * @param date2
	 * @return boolean 
	 */
	public static boolean isBefore(Date date1,Date date2){
		DateTime time1=new DateTime(date1);
		DateTime time2=new DateTime(date2);
		return time1.isBefore(time2);
	}
	
	public static String removeMidline(String date){
		return StringUtils.replaceChars(date, DATE_MIDLINE, "");
	}
	
	/**
	 * 计算年龄（周岁），截止当前时间
	 * @Description: TODO 
	 * @param  birthday
	 * @return int 
	 */
	public static int getAge(Date birthday){
		return getAge(birthday, new Date());
	}
	
	/**
	 * 计算年龄（周岁）
	 * @Description: 计算年龄（周岁） 
	 * @param  birthday
	 * @param  endDate
	 * @return int 
	 */
	public static int getAge(Date birthday,Date endDate){
		if(birthday==null)return 0;
		if(endDate==null)endDate=new Date();
		
		DateTime birthTime=new DateTime(birthday);
		DateTime endTime=new DateTime(endDate);


		int age=endTime.getYear()-birthTime.getYear();
		if(birthTime.getMonthOfYear()>endTime.getMonthOfYear() || birthTime.getMonthOfYear()==endTime.getMonthOfYear() && birthTime.getDayOfMonth()>endTime.getDayOfMonth()){
			age-=1;
		}

		return age;
	}
	
	/**
	 * 将 "06/05/2014 01:57:14 AM" 转换成 yyyy-MM-dd 格式
	 * @author 刘贞波
	 * @2014-06-08
	 * @Description: TODO 
	 * @param strDateAPM
	 * @return String 
	 */
	public static String formatDateAPM(String strDateAPM){
		try {
			if(null != strDateAPM){
				SimpleDateFormat sdfAPM = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a", Locale.US);
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
				Date d = sdfAPM.parse(strDateAPM);
				return sdf.format(d);
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}
	

	/**
	 * 将10/22/2008 02:00:00 PM 格式的时间转换成标准的时间
	 * @author 刘贞波
	 * @2014-05-28
	 * @Description: TODO 
	 * @param strDate	传入的日期字字符串
	 * @param  split	定义分割符
	 * @return String 
	 */
//	public static String formatDateAPM(String strDate,String split){
//		try {
//			if(null != strDate && strDate.trim().length()>0){
//				if(strDate.indexOf("PM")!=-1){
//					StringBuffer sub = new StringBuffer();
//					String str1 = strDate.substring(0, 11);
//					String str2 = strDate.substring(11,13);
//					String str3 = strDate.substring(13, strDate.length()-3);
//					int hour = Integer.valueOf(str2)+12;
//					sub.append(str1);
//					sub.append(String.valueOf(hour));
//					sub.append(str3);
//					strDate = sub.toString();
//				}else{
//					strDate=strDate.substring(0, strDate.length()-3);
//				}
//				SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
//				SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy"+split+"MM"+split+"dd HH:mm:ss");
//				Date dt1 = sdf.parse(strDate);
//				return sdf2.format(dt1);
//			}
//		} catch (ParseException e) {
//			e.printStackTrace();
//		}
//		return null;
//	}
	
	/**
	 * 将标准的"yyyy-MM-dd HH:mm:ss"日期格式转换成美亚所需要的日期格式 "10/22/2008 02:00:00 PM"
	 * @author 刘贞波
	 * @2014-05-28
	 * @Description: TODO 
	 * @param strDate
	 * @param split
	 * @return String 
	 * @Description: TODO 
	 * @param strDate
	 * @return String 
	 */
	public static String parseDateAPM(String strDate){
		try {
			if(strDate.trim().indexOf(" ")==-1){
				strDate +=" 00:00:00";
			}
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			Date datte = sdf.parse(strDate);
			SimpleDateFormat sdformat = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a", Locale.US);
			return sdformat.format(datte);
			
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * @Description: 将yyyy-MM-dd HH:mm:ss 转换成yyyy-MM-dd
	 * @param @param strDate
	 * @param format 
	 * @return String 
	 * @throws ParseException
	 */
	public static String getDate(String strDate,String format) throws ParseException{
		Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(strDate);
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		return sdf.format(date);
	}
	
	/**
	 * @Description: 将yyyy-MM-dd HH:mm:ss 转换成yyyy-MM-dd
	 * @param @param strDate
	 * @param @return 
	 * @return String 
	 * @throws ParseException
	 */
	public static String getDate(String strDate) throws ParseException{
		Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(strDate);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		return sdf.format(date);
	}
	
	/**
	 * 
	 * @Description: 将yyyy-MM-dd HH:mm:ss 转换成  HH:mm:ss
	 * @param @param strDate
	 * @return String 
	 */
	public static String getTime(String strDate) throws ParseException{
		Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(strDate);
		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
		return sdf.format(date);
	}
	
	/**
	 * 时间加法 
	 * @Description: 时间加法  
	 * @param date
	 * @param period 时间期间，1D,1-7D都是可能的，可选的单位有D,W,M,Y
	 * @return Date 
	 */
	public static Date add(Date date, String period) {
		if(StringUtils.isEmpty(period)){
			return date;
		}
		else if(period.indexOf(TMALL_PERIOD_UNIT_DAY)>-1){
			int begin,end;
			begin=period.indexOf("-");
			if(begin<0){
				begin=0;
			}else{
				begin=begin+1;
			}
			end =period.indexOf(TMALL_PERIOD_UNIT_DAY);
			int periodNotUnit=Integer.parseInt(period.substring(begin, end));
			return getDateToPlusDays(date, periodNotUnit);
		}
		else if(period.indexOf(TMALL_PERIOD_UNIT_WEEK)>-1){
			int begin,end;
			begin=period.indexOf("-");
			if(begin<0){
				begin=0;
			}else{
				begin=begin+1;
			}
			end =period.indexOf(TMALL_PERIOD_UNIT_WEEK);
			int periodNotUnit=Integer.parseInt(period.substring(begin, end));
			return getDateToPlusWeeks(date, periodNotUnit);
			
		}
		else if(period.indexOf(TMALL_PERIOD_UNIT_MONTH)>-1){
			int begin,end;
			begin=period.indexOf("-");
			if(begin<0){
				begin=0;
			}else{
				begin=begin+1;
			}
			end =period.indexOf(TMALL_PERIOD_UNIT_MONTH);
			int periodNotUnit=Integer.parseInt(period.substring(begin, end));
			return getDateToPlusMonths(date, periodNotUnit);
			
		}
		else if(period.indexOf(TMALL_PERIOD_UNIT_YEAR)>-1){
			int begin,end;
			begin=period.indexOf("-");
			if(begin<0){
				begin=0;
			}else{
				begin=begin+1;
			}
			end =period.indexOf(TMALL_PERIOD_UNIT_YEAR);
			int periodNotUnit=Integer.parseInt(period.substring(begin, end));
			return getDateToPlusYears(date, periodNotUnit);
			
		}
		else{
			return date;
		}
		
	}
	
	/**
	 * 计算两个日期的相隔天数
	 * @Description: 计算两个日期的相隔天数 
	 * @param date1
	 * @param date2
	 * @return int 
	 * @throws
	 */
	public static int getDValueOfDay(Date date1,Date date2){
		
		/*DateTime time1 =  new DateTime(date1);
		DateTime time2 =  new DateTime(date2);
		
		return Days.daysBetween(time1, time2).getDays();*/
		
		int dValue=new Long((date2.getTime()-date1.getTime())/day).intValue();
		return dValue>=0?dValue:-dValue;
		//fooDate.
		 //0;
	}

	
	public static void  main(String []agrs){
		long befTime=System.nanoTime();
    	
    	
		System.out.println(getDValueOfDay(DateUtils.parseDate("20140101000000", "yyyyMMddHHmmss"), DateUtils.parseDate("20121231235959", "yyyyMMddHHmmss")));
		System.out.println("deleteTicketNo-run:"+(System.nanoTime()-befTime)/1000000);
		
		befTime=System.nanoTime();
		System.out.println(getDValueOfDay(DateUtils.parseDate("20120101000000", "yyyyMMddHHmmss"), DateUtils.parseDate("20130101000000", "yyyyMMddHHmmss")));
		System.out.println("deleteTicketNo-run:"+(System.nanoTime()-befTime)/1000000);
		//System.out.println(DateUtils.formatDate(add(new Date(), "1-22M"), PATTERN_TIME));;
		
		//DateUtils.parseDate("20151228000000", PATTERN_DATE_TIME);
		//System.out.println(getNowTime());
		//System.out.println(DateUtils.formatDate(DateUtils.getDateToMinus(DateUtils.parseDate("20151228000000", "yyyyMMddHHmmss"), 1000l), "yyyy-MM-dd HH:mm:ss"));
		//System.out.println(DateUtils.formatDate(DateUtils.getDateToMinusMillis(DateUtils.parseDate("20151228000000", "yyyyMMddHHmmss"), 1000), "yyyy-MM-dd HH:mm:ss"));
	}

}
